/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "head.h"
#include "hook.h"
#include "mgr.h"

////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_common
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container* container_ptr = 0;
    static mgr::T* mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {
        m_pMisc = 0;
    }

    mgr::~mgr()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container* pContainer, i_common** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_container::i_container* mgr::container()
    {
        return container_ptr;
    }

    mgr::T* mgr::get()
    {
        return mgr_ptr;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    i_id_generator* mgr::id_generator()
    {
        id_generator_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_alloc* mgr::alloc()
    {
        mem_alloc_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_sha* mgr::sha()
    {
        sha_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_md5* mgr::md5()
    {
        md5_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_misc* mgr::misc()
    {
        return m_pMisc;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // for com_object_no_ref to use.
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            hook::init();
        }

        if( 0 == ret )
        {
            misc_impl::T* pT = 0;
            xos_stl::init_pool_item( pT );
            m_pMisc = pT;
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pMisc );
        hook::term();
        return ret;
    }

} // xos_common
